package br.pucrs.simulador.problemas;

import java.util.ArrayList;

import br.pucrs.simulador.comum.Estatistica;
import br.pucrs.simulador.comum.Evento;
import br.pucrs.simulador.comum.ListaEvento;
import br.pucrs.simulador.comum.Randomico;
import br.pucrs.simulador.comum.TipoEvento;

public class Arquitetura {
	
	protected double chF1De;
	protected double chF1Ate;
	protected double chF2De;
	protected double chF2Ate;
	protected double chF3De;
	protected double chF3Ate;

	protected double atF1De;
	protected double atF1Ate;
	protected double atF2De;
	protected double atF2Ate;
	protected double atF3De;
	protected double atF3Ate;
	
	protected int numeroExecucoes;
	
	protected Randomico rand;
	
	protected ListaEvento eventos;
	
	protected double [] fila1;
	protected double [] fila2;
	protected double [] fila3;
	
	protected int posicaoFila1;
	protected int posicaoFila2;
	protected int posicaoFila3;
	
	protected int posicaoUtilizadaFila1;
	protected int posicaoUtilizadaFila2;
	protected int posicaoUtilizadaFila3;
	
	protected double tempo;
	protected double tempoAnterior;

	public Arquitetura(double chegadaF1De, double chegadaF1Ate,
			double atendimentoF1De, double atendimentoF1Ate,
			double chegadaF2De, double chegadaF2Ate, double atendimentoF2De,
			double atendimentoF2Ate, double chegadaF3De, double chegadaF3Ate,
			double atendimentoF3De, double atendimentoF3Ate,
			int numeroExecucoes) {

		this.chF1De = chegadaF1De;
		this.chF1Ate = chegadaF1Ate;
		this.atF1De = atendimentoF1De;
		this.atF1Ate = atendimentoF1Ate;
		this.chF2De = chegadaF2De;
		this.chF2Ate = chegadaF2Ate;
		this.atF2De = atendimentoF2De;
		this.atF2Ate = atendimentoF2Ate;
		this.chF3De = chegadaF3De;
		this.chF3Ate = chegadaF3Ate;
		this.atF3De = atendimentoF3De;
		this.atF3Ate = atendimentoF3Ate;
		this.numeroExecucoes = numeroExecucoes;
		
		rand = new Randomico();
		
		eventos = new ListaEvento();
		
		fila1 = new double[tamFilas];
		fila2 = new double[tamFilas];
		fila3 = new double[tamFilas];
		
		this.inicializaTemposFilas();
		
		posicaoFila1 = 0;
		posicaoFila2 = 0;
		posicaoFila3 = 0;
		
		posicaoUtilizadaFila1 = 0;
		posicaoUtilizadaFila2 = 0;
		posicaoUtilizadaFila3 = 0;
		
		tempo = 0;
		tempoAnterior = 0;

	}
	
	private static int tamFilas = 300;
	
	private void inicializaTemposFilas(){
		
		for(int i=0;i<tamFilas;i++){
			this.fila1[i] = 0;
			this.fila2[i] = 0;
			this.fila3[i] = 0;
		}
		
	}
	

	protected void contabiliza(){
		
		double tempoDelta = (this.tempo - tempoAnterior);
		
		this.fila1[posicaoFila1] += tempoDelta;
		this.fila2[posicaoFila2] += tempoDelta;
		this.fila3[posicaoFila3] += tempoDelta;
		
		
		//Somente para saber ate qual posicao cada fila foi utilizada
		if(posicaoUtilizadaFila1 < posicaoFila1)
			posicaoUtilizadaFila1 = posicaoFila1;
		
		if(posicaoUtilizadaFila2 < posicaoFila2)
			posicaoUtilizadaFila2 = posicaoFila2;
		
		if(posicaoUtilizadaFila3 < posicaoFila3)
			posicaoUtilizadaFila3 = posicaoFila3;
				
	}
	
	protected void agendaEvento(TipoEvento evento, double a, double b){
		
		double r = rand.rand(a, b);
		
		Evento ev = new Evento(evento, tempo + r);
		
		eventos.addEvento(ev);
		
	}
	
	

}
